<html>
<body>
  <script src="https://unpkg.com/vue@1.0.28/dist/vue.js"></script>
  <script src="https://unpkg.com/vuex@1.0.1/dist/vuex.js"></script>

  <div id="app"></div>

  <script>
    const store = new Vuex.Store({
      state: {
        counter: 0
      },
      mutations: {
        INCREMENT: state => state.counter++,
        DECREMENT: state => state.counter--,
        SET_COUNTER: (state, value) => state.counter = value
      }
    })

    Vue.component('data-test', {
      template: `<div>
        {{ bool }} {{ text }} {{ number }}
      </div>`,
      data () {
        return {
          bool: false,
          text: 'hello world',
          number: 0
        }
      }
    })

    Vue.component('vuex-test', {
      template: `<div>
        <div>{{ counter }} {{ isMoreThanTwo }}</div>
        <div>
          <button @click="$store.dispatch('INCREMENT')">+1</button>
          <button @click="$store.dispatch('DECREMENT')">-1</button>
          <button @click="$store.dispatch('SET_COUNTER', 0)">Reset</button>
        </div>
      </div>`,
      computed: {
        counter () {
          return this.$store.state.counter
        }
      },
      vuex: {
        getters: {
          isMoreThanTwo: state => state.counter > 2
        }
      }
    })

    Vue.component('event-test', {
      template: `<div>
        <button @click="$emit('foo', 'bar')">Emit event</button>
        <button @click="$dispatch('foo', 'meow')">Dispatch event</button>
        <button @click="$broadcast('foo', 'waf')">Broadcast event</button>
      </div>`
    })

    new Vue({
      el: '#app',
      store,
      template: `<div id="app">
        <data-test></data-test>
        <vuex-test></vuex-test>
        <event-test @foo="onFoo"></event-test>
      </div>`,
      methods: {
        onFoo (value) {
          console.log(value)
        }
      }
    })
  </script>
</body>
</html>
